// 简答题
// 一、请说出下列最终的执行结果，并解释为什么。
// var a = [];
// for(var i = 0; i < 10; i++){
//   a[i] = function(){
//     console.log(i)
//   }
// }
// a[6]()
// 最终输出10，因为这里循环体中声明变量关键词是var，因为这里声明的i始终是全局的i，这里的i经过循环后已经累到了10，可以用let的块级作用域特性或闭包去解决。

// 二、请说出下列最终的执行结果，并解释为什么。
// var tep = 123;
// if(true){
//   console.log(tmp)
//   let tmp;
// }
// 执行结果会报错，因为在if代码块中存在let声明了temp，所以这里的temp指的是let声明的tmp,但是let声明不会造成声明提升，在let前使用会报错

// 三、结合ES6新语法，用最简单的方式找出数组中的最小值
// var arr = [12,34,32,89,4]
// console.log(Math.min(...arr));

// 四、请详细说明var、let、const三种声明方式的区别；
//           let        const             var
//  作用域   块级         块级             全局
// 定义范围  任意变量   常量（可修改堆中数据） 任意变量
// 声明提升  否            否              是

// 五、请说出下列最终的执行结果，并解释为什么。
// var a = 10;
// var obj = {
//   a:20,
//   fn(){
//     setTimeout(()=>{
//       console.log(this.a);
//     })
//   }
// }
// obj.fn()
// 输出20，调用setTimeout的对象是globalthis,但是settimeout中的回调是箭头函数，没有自己的this,this在外层作用于,fn上下文中的this为obj。obj.a=20

// 六、简述Symbol类型的用途
// 解决对象中只能放string的问题
// 可以利用这个特性创建私有属性，无法被遍历或序列化，只能通过Obeject.getOwnPropertySymbols获取

// 七、说说什么是浅拷贝，什么是深拷贝；
// 进行拷贝时是否开辟了新的堆内存

// 八、请简述TypeScript和JavaScript的关系；
// TypeScript包含了JS、类型系统和ES6+,能够自动转换ES6+的新特性，是JS的超集。

// 九、TS优缺点；
// 有点：渐进式，可以学一点用一点。任何JS环境都可以运行
// 缺点：语法更为复杂。初期会增加开发成本。

// 十、引用计数原理和优缺点
// 原理： 给对象设置引用数，引用关系改变时修改引用数、引用为0时清除；
// 优点：能够做到立即回收，减少程序的暂停；
// 缺点：时间开销大、资源消耗多。不能处理循环引用的对象

// 十一、描述标记整理算法的工作流程
// 1.遍历所有对象，标记活动对象。
// 2.遍历所有对象，清除没有标记的对象。
// 3.清除阶段移动对象位置进行整理。
// 4.清除标记

// 十二、描述V8中新生代存储区垃圾回收的流程。
// 1.主要思想为复制算法+标记整理。
// 2.将内存分为FROM和TO两个等大的空间。
// 3.将活动对象存储在FRom中。
// 4.标记整理后将活动对象拷贝到TO。
// 5.交换FROM和TO空间进行释放。

// 十三、描述增量标记算法何时使用及工作原理。
// 增量标记算法主要用于提升垃圾回收的效率。将整体的垃圾回收操作拆分成小步骤，回收与程序交替运行，减少程序的卡顿。